<?
/* Se asegura que el archivo es incluido por el index */
	defined( 'LOAD_MODULE_ACTION' ) or die( 'No esta permitido el acceso directo a ' . __FILE__ );  
	/* Cuando se hace el include del archivo automaticamente crea un objeto y lo guarda en una variable temporal */
		$this->oTmpObject = new Movimiento_exe( $this );
		
	class Movimiento_exe extends Exe
	{
		function Movimiento_exe( &$oModule )
			{
				$this->Exe( $oModule );
			}
		function undoConfirm($ncTipoOrden, $ncOrden)
			{
				if( !$ncTipoOrden || !$ncOrden ) return false;				
				// Por cada movimiento confirma y actualiza la cantidad
				$aMovimientos = $this->oDatabase->getMatrix ("SELECT ncMovimiento, ncProducto, nqProducto  FROM gtMovimientoProducto WHERE ncTipoOrden= $ncTipoOrden AND  ncOrden= $ncOrden AND bConfirmado = 1");
				foreach( $aMovimientos  as $aMovimiento )
				{
					$this->oDatabase->beginTran();
					$bRet1 = $this->oDatabase->execute( "UPDATE gtProducto SET nqStock=nqStock - " . $aMovimiento['nqProducto'] . " WHERE ncProducto = " . $aMovimiento['ncProducto'] );
					$bRet2 = $this->oDatabase->update( "gtMovimientoProducto", "bConfirmado", 0, "WHERE",  "ncMovimiento", $aMovimiento['ncMovimiento']  );
					if($bRet1 == false || $bRet2 == false )
					{
						addMessage("Se produjo un error confirmando el movimiento " . $aMovimiento['ncMovimiento'] );
						$this->oDatabase->rollBackTran();
						return false;
					}
					$this->oDatabase->commitTran();
				}
				return true;
			}
		function confirm($ncTipoOrden, $ncOrden)
			{
				if( !$ncTipoOrden || !$ncOrden ) return false;
				// Por cada movimiento confirma y actualiza la cantidad
				$aMovimientos = $this->oDatabase->getMatrix ("SELECT ncMovimiento, ncProducto, nqProducto  FROM gtMovimientoProducto WHERE ncTipoOrden= $ncTipoOrden AND  ncOrden= $ncOrden AND bConfirmado = 0");
				foreach( $aMovimientos  as $aMovimiento )
				{
					$this->oDatabase->beginTran();
					$bRet1 = $this->oDatabase->execute( "UPDATE gtProducto SET nqStock=nqStock + " . $aMovimiento['nqProducto'] . " WHERE ncProducto = " . $aMovimiento['ncProducto'] );
					$bRet2 = $this->oDatabase->update( "gtMovimientoProducto", "bConfirmado", 1, "WHERE",  "ncMovimiento", $aMovimiento['ncMovimiento']  );
					if($bRet1 == false || $bRet2 == false )
					{
						addMessage("Se produjo un error confirmando el movimiento " . $aMovimiento['ncMovimiento'] );
						$this->oDatabase->rollBackTran();
						return false;
					}
					$this->oDatabase->commitTran();
				}
				return true;
			}
			//
		function deleteOrden( $ncTipoOrden, $ncOrden )
			{
				if( !$ncTipoOrden || !$ncOrden ) return false;
				// Verifica que no este confirmado
				$bConfirmado = $this->oDatabase->getData("SELECT bConfirmado FROM gtMovimientoProducto WHERE ncTipoOrden= $ncTipoOrden AND  ncOrden= $ncOrden");
				if ( $bConfirmado  )
				{
					addMessage('No se puede eliminar o modificar una ordern cuando ya fue confirmada. Desconfirmela y vuelva a intentar.');
					return false;
				}					
				// Lo emilina
				return $this->oDatabase->delete( "gtMovimientoProducto", "ncTipoOrden", $ncTipoOrden, "ncOrden", $ncOrden );
			}
		function insert()
			{
				// Convierte a variables los datos del Formulario asociado a la accion
				$oForm = $this->oModule->loadClass( 'Movimiento_frm' );
				extract( $oForm->getFieldArray() );
				// Primero Verifica que el Producto no este en la orden
				$nqExiste = $this->oDatabase->getData("SELECT count(*) FROM gtMovimientoProducto WHERE ncTipoOrden =$ncTipoOrden AND ncOrden = $ncOrden AND ncProducto = $ncProducto" );
				if ( $nqExiste  > 0 ) 
				{
					addMessage('El producto ya esta en la orden!!!');
					return false;
				}
				if ( $ncTipoOrden == TIPO_ORDEN_EGRESO )  $nqProducto = -1 * $nqProducto;
				$ncMovimiento = $this->oDatabase->nextkey( "gtMovimientoProducto", "ncMovimiento");
				// Agrega Moviemiento
					$this->oDatabase->insert("gtMovimientoProducto",
									"ncProducto", $ncProducto, 
									"nqProducto", $nqProducto, 
									"ncTipoOrden", $ncTipoOrden, 
									"ncOrden", $ncOrden, 
									"bConfirmado", 0, 
									"ncMovimiento", $ncMovimiento );
				$this->oModule->setTarget("body_main");
				if ( $ncTipoOrden == TIPO_ORDEN_EGRESO ) $this->oModule->setRedirect( MODIFICAR_EGRESO, "ncEgreso=$ncOrden&ncTipoOrden=". TIPO_ORDEN_EGRESO. "&ncOrden=$ncOrden" );
				if ( $ncTipoOrden == TIPO_ORDEN_INGRESO ) $this->oModule->setRedirect( MODIFICAR_INGRESO, "ncIngreso=$ncOrden&ncTipoOrden=". TIPO_ORDEN_INGRESO. "&ncOrden=$ncOrden" );
				$oForm->reset();
			}
		// ELIMINAR_UN_MOVIMIENTO
		function delete()
			{
				$ncMovimiento = getParam('ncMovimiento');
				if( !$ncMovimiento ) return false;
				// Verifica que no este confirmado
				$bConfirmado = $this->oDatabase->getData("SELECT bConfirmado FROM gtMovimientoProducto WHERE ncMovimiento= $ncMovimiento");
				if ( $bConfirmado  )
				{
					addMessage('El movimiento ya fueron confirmado');
					return false;
				}					
				// Lo emilina
				$this->oDatabase->delete( "gtMovimientoProducto", "ncMovimiento", $ncMovimiento );
			}
	}
?>
